//
// Created by mio on 25-4-17.
//

#ifndef RTMPMESSAGE_H
#define RTMPMESSAGE_H

#include <cstdint>
#include <memory>


struct RtmpMessageHeader
{
    uint8_t timestamp[3];   /// 0‑2：时间戳或时间戳增量（24 bit，BE）
    uint8_t length[3];      /// 3‑5：消息负载长度（24 bit，BE）
    uint8_t type_id;        /// 6  ：消息类型 ID
    uint8_t stream_id[4];   /// 7‑10：消息所属 StreamID（32 bit，**LE**）
};

struct RtmpMessage
{
    // --------- 从消息头解析出的关键信息 ---------
    uint32_t timestamp = 0;         /// 基础时间戳（0~0xFFFFFF）, 若使用 Type‑0 头，则是绝对时间戳
    uint32_t length = 0;            /// 消息载荷长度
    uint8_t type_id = 0;            /// 消息类别
    uint32_t stream_id = 0;         /// 消息所属 media / command stream
    uint32_t extend_timestamp = 0;  /// 当 timestamp &ge; 0xFFFFFF 时启用

    // --------- 本地接收辅助字段（非协议字段） --------
    uint64_t _timestamp = 0;        /// 解析时记录的本地时钟，可做 jitter/RTT 统计
    uint8_t  codecId = 0;           /// 对音视频包：音频/视频编码信息

    // --- Chunk 层信息 ---
    uint8_t  csid = 0;              /// Chunk Stream ID（Basic Header 中的 CSID）
    uint32_t index = 0;             /// 已写入 payload 的字节计数

    // --- 消息负载 ---
    std::shared_ptr<char> payload = nullptr;

    void Clear()    /// 重置对象，准备解析下一条 Message
    {
        index = 0;
        timestamp = 0;
        extend_timestamp = 0;
        if (length > 0)
        {
            payload.reset(new char[length], std::default_delete<char[]>());
        }
    }

    bool IsCompleted() const     /// 判断当前 Message 是否已经收集完全部载荷
    {
        if (index == length && length > 0 && payload != nullptr) return true;
        return false;
    }
};

#endif //RTMPMESSAGE_H
